package com.senlingspace.system.mapper;

import java.util.Date;
import java.util.List;
import java.util.Set;

import com.senlingspace.system.domain.dto.*;
import com.senlingspace.system.domain.SlkjOrder;
import com.senlingspace.system.domain.query.senling.QueryOrderExport;
import com.senlingspace.system.domain.vo.*;
import org.apache.ibatis.annotations.Param;

/**
 * 订单Mapper接口
 *
 * @author SenlingSpace
 * @date 2024-07-25
 */
public interface SlkjOrderMapper {


    /**
     * 修改订单状态已领设备的为已完成
     *
     * @param
     * @return 结果
     */
    public int updateStatus();


    Boolean getStatusByOrderNumber(String orderNumber);

    /*获取投资人分账总金额*/
    InvestorPersionVO getInvestorTotalAmount(@Param("investorId") Long investorId);

    /*获取投资人分账echar图数据*/
    List<InvestorShareDTO> getInvestorOrdersByDate(InvestorCollectVo investorCollectVo);

    /**
     * 投资方日分账汇总
     *
     * @param investorShareVo 订单
     * @return 订单集合
     */
    public List<InvestorCollectDTO> getInvestorCollect(InvestorCollectVo investorShareVo);


    /**
     * 投资方日分账明细表
     *
     * @param investorShareVo 订单
     * @return 订单集合
     */
    public List<InvestorShareDTO> getInvestorProfitShare(InvestorShareVo investorShareVo);

        /**
     * 查询订单
     *
     * @param thirdOrderNumber 第三方单号;比如：美团、抖音
     * @return 订单
     */
    public SlkjOrder selectSlkjOrderByThird(String thirdOrderNumber);


    /**
     * 查询订单
     *
     * @param orderId 订单主键
     * @return 订单
     */
    public SlkjOrder selectSlkjOrderByOrderId(Long orderId);

    /**
     * 查询订单
     *
     * @param orderNumber 订单号
     * @return 订单
     */
    SlkjOrder selectSlkjOrderByOrderNumber(String orderNumber);

    /**
     * 查询订单列表和详情
     *
     * @param slkjOrder 订单
     * @return 订单集合
     */
    public List<OrderDto> listDetail(OrderDto slkjOrder);


    /**
     * 查询订单列表
     *
     * @param slkjOrder 订单
     * @return 订单集合
     */
    public List<SlkjOrder> selectSlkjOrderList(SlkjOrder slkjOrder);
    public List<SlkjOrder> selectSlkjOrderList(QueryOrderExport queryOrderExport);


    /**
     * 新增订单
     *
     * @param slkjOrder 订单
     * @return 结果
     */
    public int insertSlkjOrder(SlkjOrder slkjOrder);

    /**
     * 修改订单
     *
     * @param slkjOrder 订单
     * @return 结果
     */
    public int updateSlkjOrder(SlkjOrder slkjOrder);


    /**
     * 修改订单 根据订单编号
     *
     * @param slkjOrder 订单
     * @return 结果
     */
    int updateSlkjOrderByOrderNumber(SlkjOrder slkjOrder);


    /**
     * 删除订单
     *
     * @param orderId 订单主键
     * @return 结果
     */
    public int deleteSlkjOrderByOrderId(Long orderId);

    /**
     * 批量删除订单
     *
     * @param orderIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteSlkjOrderByOrderIds(Long[] orderIds);

    /**
     * 根据时间获取订单信息
     *
     * @param startTime
     * @param endTime
     * @return java.util.List<com.senlingspace.system.domain.SlkjOrder>
     * @author Administrator
     */
    List<SlkjOrder> selectSlkjOrderByTimeList(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询pos订单
     *
     * @param queryParam
     * @return {@link List }<{@link SlkjOrder }>
     */
    List<SlkjOrder> selectPosOrderList(PosOrderQueryVo queryParam);

    List<SlkjOrder> selectSlkjOrderByTime(@Param("startTime") Date startTime, @Param("shopId") Long shopId);

    List<SlkjOrder> selectSlkjOrderByTimes(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("shopId") Long shopId);

    List<SlkjOrder> selectSlkjOrder(@Param("startTime") Date startTime, @Param("shopId") Long shopId, @Param("endTime") Date endTime);

    /**
     * 获取门店支付的订单（未更新服务费的）
     *
     * @param excludeOrderIds 排除订单id
     * @return {@link List }<{@link SlkjOrder }>
     */
    List<SlkjOrder> selectOnShopOrderList(@Param("excludeOrderIds") Set<Long> excludeOrderIds);

    /**
     * 更新订单的服务费
     *
     * @param orderId
     * @param feeAmountHao
     * @param settleAmountHao
     * @return int
     */
    int updateOrderFeeAmount(@Param("orderId") Long orderId,
                             @Param("feeAmountHao") Integer feeAmountHao,
                             @Param("settleAmountHao") Integer settleAmountHao);

    /**
     * 更新订单的票面总额
     *
     * @param orderId
     * @param ticketTotalAmount
     * @return int
     */
    int updateTicketTotalAmount(@Param("orderId") Long orderId, @Param("ticketTotalAmount") Integer ticketTotalAmount);

    /**
     * 更新订单的支付请求id
     *
     * @param order
     * @return int
     */
    int updateOrderPaymentRequestId(SlkjOrder order);

    /**
     * 订单过期扫描
     *
     * @param expiredMinute 过期分钟
     * @return {@link List }<{@link SlkjOrder }>
     */
    List<SlkjOrder> expireOrderScan(@Param("expiredMinute") int expiredMinute);

    /**
     * 批量更新订单业务状态
     *
     * @param orders
     * @return long
     */
    long batchUpdateOrderBusinessStatus(@Param("orders") List<SlkjOrder> orders);

    List<SlkjOrder> selectSlkjOrderLists(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("shopId") Long shopId, @Param("projectName") String projectName);

    List<SlkjOrder> selectSlkjOrderByList(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("shopId") Long shopId);

    List<SlkjOrder> selectSlkjOrderByLists(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("projectName") String projectName);

    List<SlkjCopyrightVo> selectOrderByTimeList(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("projectName") String projectName);

    List<SlkjOrder> selectSlkjOrderByTimeListWithOffset(@Param("startTime") Date startTime,
                                                        @Param("endTime") Date endTime,
                                                        @Param("shopId") Long shopId,
                                                        @Param("offset") int offset,
                                                        @Param("batchSize") int batchSize);

    List<SlkjOrder> selectSlkjOrderByTimeLists(@Param("shopIds") Set<Long> shopIds);

    /**
     * 查询商品交易汇总列表
     *
     * @param startTime
     * @param endTime
     * @param shopId
     * @return
     */
    List<GoodsIncomeDTO> selectProductOrder(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("shopId")Long shopId,@Param("productTpyeId") Long productTpyeId);

    /**
     * 查询小程序订单列表
     *
     * @param type
     * @param customerId
     * @param shopId
     * @return {@link List }<{@link SlkjOrder }>
     */
    List<SlkjOrder> miniAppOrderList(@Param("type") String type, @Param("customerId") Long customerId, @Param("shopId") Long shopId);

    /**
     * 更新订单地址
     *
     * @param orderId
     * @param address
     * @return int
     */
    int updateOrderAddress(@Param("orderId") Long orderId, @Param("address") String address);

    /**
     * 核销记录
     *
     * @return {@link List }<{@link VerificationRecordsDto }>
     */
    List<VerificationRecordsDto> verificationRecords(VerificationRecordsRequest request);

    /**
     * 查询票类汇总列表
     *
     * @return
     */
    List<TicketIncomeDTO> selectOrderList(
            @Param("startTime") Date startTime,
            @Param("endTime") Date endTime,
            @Param("shopId") Long shopId,
            @Param("ticketId") Long ticketId);

    /**
     * 到付商品订单列表
     *
     * @param request
     * @return {@link List }<{@link PaymentUponReceiptDTO }>
     */
    List<PaymentUponReceiptDTO> paymentUponReceipt(PaymentUponReceiptRequest request);

    /**
     * 查询订单流水列表
     *
     * @return {@link List }<{@link SlkjOrder }>
     */
    List<SlkjOrder> selectSlkjOrders(
            @Param("startTime") Date startTime,
            @Param("endTime") Date endTime,
            @Param("shopId")Long shopId,
            @Param("type")String type,
            @Param("source")Integer source);
}
